import asyncio
import requests
import time

#传统的异步架构，在网络io无法实现异步
start = time.time()

#请求网页 得到网页的输出
# async def task():
#     url = 'http://www.sina.com.cn'
#     print(f"{time.strftime('%H:%M:%S')} task 开始请求 ")
#     time.sleep(2)
#     response = requests.get(url)#request对象保存全部请求数据  response保存全部返回数据
#     print(f'得到响应 {response.text}')
#
# tasks = [task() for i in range(5)] #for 循环5次，每循环一次调用一个task（），得到返回，得到5个返回值
# loop = asyncio.get_event_loop()#得到时间运行的循环
# print(f"{time.strftime('%H:%M:%S')} 开始调用协程任务 ")
# start  = time.time()
# loop.run_until_complete(asyncio.wait(tasks)) #当协程调用结束，让循环体通知执行
# end  = time.time()
# print(f"{time.strftime('%H:%M:%S')} 协程任务结束，耗时{end - start }秒")

from fake_useragent import UserAgent
import requests
import aiohttp


now = lambda : time.strftime('%H:%M:%S')
url = 'https://www.biquge11.cc'
#异步 得到网页内容
async  def get(url):
    #面食造型同步
    session = aiohttp.ClientSession() #session 会话  request请求 连续通讯都在一次请求中， 只要没有完全中断，
    # 没有数据交换 重新联系还是在一次会话中，一次request中说明的变量只在本次request中有效，而一次session中声明的变量在本次session中的
    # 全部request都有效
    #烤制异步
    response = await session.get(url=url)  # 使用requests对象提交请求可以更简便切换一些参数 get post
    hmtl = await  response.text()#html在response文本中 text
    # 发请求是当cpu完成发请求之后就可以挂起当前任务执行其他任务，但是网卡你继续干活
    return hmtl


async def save_data(html):
    from urllib import request  # 从摸个模块中引入对象
    from urllib.request import urlopen
    import time, os
    from bs4 import BeautifulSoup
    # headers = {
    #     'User-Agent': 'iPhone; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5'}
    # url = f'https://e6e28f7353c0746f565.bi28.cc/html/45333/{i}.html'
    # req = request.Request(url=url, headers=headers)
    # res = request.urlopen(req)  # 将包装好的请求头 发送
    # html = res.read().decode('utf-8')
    # print(html)
    soup = BeautifulSoup(html, 'html')
    title = soup.find('div', class_='header').find('span', class_='title').text.replace(' ', '_').replace('	',
                                                                                                          '_').replace(
        ' ', '\t').replace('1）', ' ').replace('修罗武神', '')
    title = title[:len(title) - 1:]
    # begin_index = title.find('\n')
    # end_index = title.find('	')
    content = soup.find('div', id='chaptercontent').text.replace(' ', '\n').replace('<br />', '\n')
    # print(title)
    # print(content)

    if not os.path.exists(r"w:\\小说\\修罗武神"):
        os.makedirs(r"w:\\小说\\修罗武神")
    f = open(r"w:\\小说\\修罗武神\\" + title + ".txt", 'a+', encoding='utf-8')
    f.write(title + '\n')
    f.write(content + '\n')
    f.close()
    time.sleep(1)

async def request(i):#烤面包，如果不把这个烤面包方法做成异步，烤5份 就一次烤一份排队烤完
    for j in range(50):
        k = 2000+ (i*50)+j
        url = f'https://e6e28f7353c0746f565.bi28.cc/html/45333/{k}.html'
        print(f"{time.strftime('%H:%M:%S')} task 开始请求 ")
        html = await get(url)#request对象保存全部请求数据  response保存全部返回数据 #得到一份完成的烤面包 可以是异步的
        await save_data(html)
        time.sleep(1)
start  = time.time()
tasks = [asyncio.ensure_future(request(i)) for i in range(20)] #for 循环5次，每循环一次调用一个task（），得到返回，得到5个返回值
loop = asyncio.get_event_loop()#得到时间运行的循环
print(f"{time.strftime('%H:%M:%S')} 开始调用协程任务 ")
loop.run_until_complete(asyncio.wait(tasks))
end  = time.time()
print(f"{time.strftime('%H:%M:%S')} 协程任务结束，耗时{end - start }秒")


